<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Annotation (Java)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Annotation_(Java)"> <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Annotation_Java rootpage-Annotation_Java skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Annotation (Java)</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Als <b>Annotation</b> wird im Zusammenhang mit der <a href="Programmiersprache" title="Programmiersprache">Programmiersprache</a> <a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> ein Sprachelement bezeichnet, das die Einbindung von <a href="Metadaten#Metadaten_in_der_Softwareentwicklung" title="Metadaten">Metadaten</a> in den <a href="Quelltext" title="Quelltext">Quelltext</a> erlaubt. Dieses Element wurde im <a href="Java_Specification_Request" title="Java Specification Request">JSR</a> 175 festgelegt und mit der Version Java 5.0 eingeführt.
</p><p>Annotationen beginnen mit einem @-Zeichen. Daran schließt sich ihr Name an. Optional kann eine kommagetrennte Parameterliste folgen, die in runden Klammern eingefasst wird. Beispielsweise markiert die Annotation im folgenden Quelltextausschnitt die Klasse A als überholt (<a href="Deprecated" class="mw-redirect" title="Deprecated">deprecated</a>):
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Deprecated</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">A</span><span class="w"> </span><span class="p">{}</span>
</pre></div>
<p>Ein <i>Annotation Processor</i> ist ein Compiler-Plugin, das Annotationen beim Kompilieren auswerten kann, um damit Warnungen und Fehlermeldungen zu unterdrücken oder auszulösen oder weiteren Quellcode oder andere Dateien zu generieren. Mit Annotationen versehenen Code kann er jedoch nicht ändern. Annotationen, bei denen das vorgesehen ist, können auch zur Laufzeit mittels <a href="Reflexion_(Programmierung)" title="Reflexion (Programmierung)">Reflection</a> ausgewertet werden.
</p><p>Eingesetzt werden Annotationen unter anderem im <a href="Jakarta_EE" title="Jakarta EE">Jakarta-EE</a>-Umfeld, um Klassen um Informationen zu erweitern, die vor Java 5 in separaten Dateien hinterlegt werden mussten. Prominente Beispiele sind Home- und Local-Interfaces sowie Deployment-Deskriptoren.
</p><p>Eine Vorgängertechnik zur Einbettung von Metadaten in Java-Quelltexten ist die Verwendung spezieller <a href="Javadoc" title="Javadoc">Javadoc</a>-Kommentare. Diese wurden mit Hilfe sogenannter <a href="Doclet" title="Doclet">Doclets</a> ausgewertet. Ein vielfach eingesetztes Werkzeug für diese Methode ist <a href="XDoclet" title="XDoclet">XDoclet</a>. Diese Technik kann auch nach Einführung der Annotationen weiterhin verwendet werden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Vordefinierte_Annotationstypen">Vordefinierte Annotationstypen</h2></div>
<p>In <a href="Java_Platform_Standard_Edition" class="mw-redirect" title="Java Platform Standard Edition">Java SE 5.0</a> stehen sieben vordefinierte Annotationstypen zur Verfügung, die in den Paketen (<a href="Java-Syntax#Pakete,_Namen,_Klassen,_Schnittstellen" title="Java-Syntax">Package</a>) <code>java.lang</code> oder <code>java.lang.annotation</code> liegen. Sie werden alle (im Gegensatz zu den meisten Annotationen) vom Compiler ausgewertet. Weitere können von Programmierern erstellt werden.
</p>
<table class="wikitable">
<tbody><tr>
<th>Annotation
</th>
<th>Beschreibung
</th></tr>
<tr>
<td colspan="2" align="left">Im Paket <code>java.lang</code> befinden sich Annotationen.
</td></tr>
<tr>
<td>@Deprecated
</td>
<td>Hiermit können Klassen, Attribute oder Methoden gekennzeichnet werden, die nicht mehr verwendet werden sollen. Der Compiler gibt dann eine Warnung aus, wenn ein so gekennzeichnetes Element verwendet wird.
<p>Es empfiehlt sich zusätzlich, einen <a href="Javadoc" title="Javadoc">Javadoc</a>-Kommentar anzubringen, der aufzeigt, wie das entsprechende Element ersetzt werden soll. Das folgende Beispiel zeigt dies:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="cm">/**</span>
<span class="cm"> * @deprecated Die Klasse A wurde mit Version 10.3 durch die Klasse ANeu ersetzt.</span>
<span class="cm"> */</span>
<span class="nd">@Deprecated</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">A</span><span class="w"> </span><span class="p">{}</span>
</pre></div>
</td></tr>
<tr>
<td>@Override
</td>
<td>Mit diesem Typ kann eine Methode gekennzeichnet werden, die die Methode ihrer Oberklasse überschreibt. Der Compiler stellt dann sicher, dass die Oberklasse diese Methode enthält und gibt einen Fehler aus, wenn dies nicht der Fall ist.
<p>Beispiel:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">A</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">eineMethode</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span>
<span class="p">}</span>
<span class="w"> </span>
<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">B</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nd">@Override</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">eineMethode</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span>
<span class="p">}</span>
</pre></div>
</td></tr>
<tr>
<td>@SuppressWarnings
</td>
<td>Bei der Verwendung dieses Annotationstyps unterdrückt der Compiler bestimmte Warnungen. Der Annotation wird dazu ein Array mit Strings übergeben, die die zu unterdrückenden Warnungen enthalten.
<p>Im folgenden Beispiel wird der Compiler angewiesen, die <i>deprecated</i>-Warnung für die Klasse EineDeprecatedKlasse zu unterdrücken:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">A</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nd">@SuppressWarnings</span><span class="p">({</span><span class="s">"deprecation"</span><span class="p">})</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">eineMethode</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">EineDeprecatedKlasse</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">EineDeprecatedKlasse</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr>
<tr>
<td>@SafeVarargs
</td>
<td>Mit dieser Annotation wird versichert, dass die Varargs-Parameter mit Generics nicht zur Laufzeit mit einem unpassenden Generics-Typ ersetzt werden. Beim Aufruf der Methode bzw. des Konstruktors wird dann keine Warnung angezeigt. Die Annotation wurde mit Java 7 eingeführt. Bis Java 6 konnte man beim Aufruf mit einer @SuppressWarnings-Annotation das Vertrauen in den aufgerufenen Code dokumentieren, ab Java 7 kann die Methode sich selbst als vertrauenswürdig deklarieren.
</td></tr>
<tr>
<td colspan="2" align="left">Im Paket <code>java.lang.annotation</code> – diese werden nur für die Definition von Annotationen gebraucht.
</td></tr>
<tr>
<td>@Documented
</td>
<td>Dieser Annotationstyp wird als Meta-Annotation verwendet: Eine Annotation dieses Typs legt für einen neu erstellten Annotationstyp fest, dass er von Javadoc bei der Erzeugung der Dokumentation berücksichtigt wird.
</td></tr>
<tr>
<td>@Inherited
</td>
<td>Dieser Annotationstyp wird bei der Programmierung einer Annotation angewandt. Damit kann festgelegt werden, dass diese zusammen mit einer Klasse vererbt wird. Wird diese Annotation dann beispielsweise bei einer bestimmten Klasse angewendet, so gilt diese auch für alle Klassen, die von dieser erben.
</td></tr>
<tr>
<td>@Retention
</td>
<td>Dieser Typ wird bei der Programmierung einer Annotation angewandt. Sie gibt an, wann auf sie selbst zugegriffen werden kann. Es gibt drei mögliche Werte für eine Annotation dieses Typs, die in der <a href="Aufz%C3%A4hlungstyp" title="Aufzählungstyp">Enumeration</a> <code>java.lang.annotation.RetentionPolicy</code> aufgeführt sind:
<dl><dt>CLASS</dt>
<dd>Die Annotation wird mit der Klasse kompiliert und ist damit in der .class-Datei vorhanden. Allerdings kann sie nicht während der Laufzeit einer Anwendung ausgelesen werden. Dies ist der Standardwert.</dd>
<dt>RUNTIME</dt>
<dd>Die Annotation kann während der Laufzeit einer Anwendung mittels des <a href="Reflexion_(Programmierung)" title="Reflexion (Programmierung)">Reflection-Mechanismus</a> ausgelesen werden.</dd>
<dt>SOURCE</dt>
<dd>Die Annotation wird vor dem Kompilieren aus dem Quelltext entfernt. Entsprechend steht sie zur Laufzeit eines Programms nicht zur Verfügung.</dd></dl>
</td></tr>
<tr>
<td>@Target
</td>
<td>Dieser Annotationstyp wird bei der Programmierung einer Annotation angewandt. Damit wird festgelegt, auf welche Elemente eines Programms sie angewendet werden darf. Die möglichen Werte für eine Annotation dieses Typs sind in der Enumeration <code>java.lang.annotation.ElementType</code> aufgeführt.
<dl><dt>TYPE</dt>
<dd>Die Annotation kann nur auf Klassen, Interfaces oder Enumerations angewandt werden.</dd>
<dt>FIELD</dt>
<dd>Die Annotation kann nur auf Felder angewandt werden.</dd>
<dt>METHOD</dt>
<dd>Die Annotation kann nur auf Methoden angewandt werden. Konstruktoren sind dabei ausgeschlossen.</dd>
<dt>PARAMETER</dt>
<dd>Die Annotation kann nur auf Parameter von Methoden und Konstruktoren angewandt werden.</dd>
<dt>CONSTRUCTOR</dt>
<dd>Die Annotation kann nur auf Konstruktoren angewandt werden.</dd>
<dt>LOCAL_VARIABLE</dt>
<dd>Die Annotation kann nur auf lokale Variablen angewandt werden.</dd>
<dt>ANNOTATION_TYPE</dt>
<dd>Die Annotation kann nur auf Annotationen angewandt werden.</dd>
<dt>PACKAGE</dt>
<dd>Die Annotation kann nur auf Paketen angewandt werden.</dd></dl>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Definition_eigener_Annotationen">Definition eigener Annotationen</h2></div>
<p>Annotationen sind spezielle Schnittstellen; ihre Namen werden daher konventionsgemäß mit großem Anfangsbuchstaben geschrieben. In ihrer Vereinbarung steht vor <code><b>interface</b></code> das Zeichen <code>@</code>. Sie erweitern implizit die Schnittstelle <code>java.lang.annotation.Annotation</code>. Sie dürfen keine andere Schnittstellen erweitern (d. h. <code><b>extends</b></code> ist verboten) und sind nicht generisch. Ihre Methoden sind parameterlos und nicht-generisch. Als Ergebnistypen (return type) sind nur folgende Typen erlaubt:
</p>
<ul><li>primitive Typen</li>
<li>Aufzählungstypen (<code><b>enum</b></code>)</li>
<li>Annotationstypen</li>
<li><code>String</code></li>
<li><code>Class</code></li>
<li>Felder (arrays) aus diesen Typen</li></ul>
<p>Sie werfen auch keine Ausnahmen und dürfen keine Rekursion verwenden.
</p><p>Viele Annotationen enthalten keine Methoden. Ein Beispiel wäre:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@interface</span><span class="w"> </span><span class="n">Vorlaeufig</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
</pre></div>
<p>Andere Annotationen enthalten (wie für Schnittstellen üblich) Methoden, allerdings nur mit den oben aufgeführten Ergebnistypen. Wenn eine Annotation nur eine Methode enthält, ist ihr Name konventionsgemäß <code>value</code>:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@interface</span><span class="w"> </span><span class="n">Test</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">value</span><span class="p">();</span><span class="w"> </span><span class="c1">// true solange nicht freigegeben</span>
<span class="p">}</span>
</pre></div>
<p>oder
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@interface</span><span class="w"> </span><span class="n">Autoren</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="nf">value</span><span class="p">();</span><span class="w"> </span><span class="c1">// Namen der Autoren</span>
<span class="p">}</span>
</pre></div>
<p>oder
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@interface</span><span class="w"> </span><span class="n">Kunden</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Person</span><span class="o">[]</span><span class="w"> </span><span class="nf">value</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
<p>wobei Person als Aufzählungstyp (<code><b>enum</b></code>) oder Annotation definiert werden muss, z. B.:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@interface</span><span class="w"> </span><span class="n">Person</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">name</span><span class="p">();</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">alter</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
<p>Bei der Vereinbarung von Annotationen werden häufig die Standard-Annotationen aus dem Paket <code>java.lang.annotation</code> verwendet. Insbesondere soll mit <code>@Retention</code> angegeben werden, wie lange die Annotation aufbewahrt werden soll: nur im Quelltext (<code>SOURCE</code>), in der gespeicherten class-Datei (<code>CLASS</code>) oder auch in der geladenen Klasse (<code>RUNTIME</code>). <code>@Target</code> beschreibt, für welche Programmelemente die Annotation verwendet werden darf. Beispielsweise sind alle Annotationsvereinbarungen im Paket <code>java.lang.annotation</code> mit den Annotationen
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Documented</span>
<span class="nd">@Retention</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">RUNTIME</span><span class="p">)</span>
<span class="nd">@Target</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">ANNOTATION_TYPE</span><span class="p">)</span>
</pre></div>
<p>versehen. Hierdurch werden sie alle von javadoc ausgewertet, im <a href="Bytecode" title="Bytecode">Bytecode</a> mit geladen und können so zur Laufzeit ausgewertet werden; außerdem dürfen sie nur für Annotationstypen verwendet werden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Verwendung_eigener_Annotationen">Verwendung eigener Annotationen</h2></div>
<p>Eine Annotation ohne Methoden, wie <code>@Vorlaeufig</code>, kann z. B. einer Klasse vorangestellt werden:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Vorlaeufig</span>
<span class="kd">class</span> <span class="nc">Klasse</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">methode</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
<p>Einer Annotation mit nur einer Methode mit dem Namen <code>value</code> muss in Klammern ein konstanter Wert vom Ergebnistyp dieser Methode mit angegeben werden:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Test</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span>
<span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">methode</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">}</span>
</pre></div>
<p>Wenn der Ergebnistyp ein Array ist, soll ein Arrayliteral verwendet werden:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Autoren</span><span class="p">({</span><span class="s">"Solymosi"</span><span class="p">,</span><span class="w"> </span><span class="s">"Grude"</span><span class="p">})</span>
<span class="n">String</span><span class="w"> </span><span class="n">buch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"Algorithmen und Datenstrukturen mit Java"</span>
</pre></div>
<p>Wenn das Array keine Elemente enthält, muss <code>({})</code> mit angegeben werden. Wenn das Array jedoch nur ein Element enthält, können die geschweiften Klammern weggelassen werden:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Autoren</span><span class="p">(</span><span class="s">"Solymosi"</span><span class="p">)</span>
<span class="n">String</span><span class="w"> </span><span class="n">anderesBuch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"Programmieren in Scala"</span>
</pre></div>
<p>Einer Annotation mit mehreren Methoden muss jeder ihrer Methoden in Klammern ein konstanter Wert zugewiesen werden:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Person</span><span class="p">(</span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"Andreas Solymosi"</span><span class="p">,</span><span class="w"> </span><span class="n">alter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">56</span><span class="p">)</span>
<span class="n">Konto</span><span class="w"> </span><span class="n">konto</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Konto</span><span class="p">();</span>
</pre></div>
<p>Die Möglichkeit, den Wert mit dem Namen anzugeben, besteht auch für Annotationen mit einer Methode (ist allerdings überflüssig, dient höchstens der Lesbarkeit):
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Test</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span><span class="p">)</span>
</pre></div>
<p>Eine komplexe (geschachtelte) Annotation muss geschachtelt angewendet werden:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Kunden</span><span class="p">(</span><span class="nd">@Person</span><span class="p">(</span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"Andreas Solymosi"</span><span class="p">,</span><span class="w"> </span><span class="n">alter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">56</span><span class="p">))</span>
<span class="kd">class</span> <span class="nc">Unternehmen</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">…</span><span class="w"> </span><span class="p">}</span>
</pre></div>
<p>In der Vereinbarung der Annotation können für die Methoden Standardwerte definiert werden; dann kann der entsprechende Wert bei der Verwendung weggelassen werden. Da Annotationen Schnittstellen sind, können sie selber mit Annotationen markiert werden:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="nd">@Autoren</span><span class="p">(</span><span class="s">"Solymosi"</span><span class="p">)</span>
<span class="kd">public</span><span class="w"> </span><span class="nd">@interface</span><span class="w"> </span><span class="n">Test</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">wert</span><span class="p">()</span><span class="w"> </span><span class="k">default</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span><span class="w"> </span><span class="c1">// muss nicht unbedingt wert heißen</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Auswertung_von_Annotationen">Auswertung von Annotationen</h2></div>
<p>Wenn die Annotationen mit dem Bytecode der Klasse geladen werden, können sie mit Hilfe von Reflexion ausgewertet werden. Beispielsweise kann man feststellen, ob eine Annotation angegeben wurde oder nicht:
</p><p><code>
<b>boolean</b> istVorlaeufig = Klasse.<b>class</b>.isAnnotationPresent(Vorlaeufig.<b>class</b>);
</code>
</p><p>Wenn man festgestellt hat, dass die Annotation vorhanden ist, dann kann man auch ihren Wert lesen, z. B. ob die Methode noch im Testzustand ist oder nicht:
</p><p><code>
Test test = Klasse.<b>class</b>.getMethod("methode", <b>new</b> Class[]{}).getAnnotation(Test.<b>class</b>).value();
</code>
</p><p>Wenn hierbei die Annotation nicht vorhanden ist, wird von <code>getAnnotation()</code> die Ausnahme <code>NullPointerException</code> ausgelöst.
Aus einer komplexen Annotation müssen ihre Elemente einzeln selektiert werden:
</p><p><code>
Person kunden = Unternehmen.<b>class</b>.getAnnotation(Kunden.<b>class</b>).value()[0];
</code>
</p>
<div class="mw-heading mw-heading2"><h2 id="Annotation_von_Paketen">Annotation von Paketen</h2></div>
<p>Die <i>Java Language Specification</i> erlaubt auch die Annotation von Paketen, beispielsweise um Dokumentation zu einem Paket bereitzustellen. Pro Paket darf maximal eine <code>package</code>-Deklaration mit Annotationen versehen sein. Falls ein Paket Annotationen erhalten soll, empfiehlt die <i>Java Language Specification</i>, eine gesonderte Datei namens <code>package-info.java</code> im Verzeichnis dieses Pakets anzulegen. Diese Datei beinhaltet dann die <code>package</code>-Deklaration mit den Annotationen.
</p>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://public.beuth-hochschule.de/~solymosi/veroeff/Annotationen.html">Annotationen in Java</a></li>
<li><a rel="nofollow" class="external text" href="http://docs.oracle.com/javase/tutorial/java/annotations/">Annotations</a> in Suns Java-Tutorial (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://docs.oracle.com/javase/1.5.0/docs/guide/apt/index.html">Annotation Processing Tool (apt)</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://docs.oracle.com/javase/1.5.0/docs/guide/language/annotations.html">The J2SE 5.0 Annotations Feature</a> bei Sun (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://jcp.org/en/jsr/detail?id=175">JSR 175: A Metadata Facility for the JavaTM Programming Language</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.7">Annotations</a> in der <a href="Java_Language_Specification" title="Java Language Specification">Java Language Specification</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="https://openbook.rheinwerk-verlag.de/javainsel/10_008.html#u10.8">Annotationen</a> in „Java ist auch eine Insel“</li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2024-12-18" href="https://de.wikipedia.org/wiki/?title=Annotation_(Java)&oldid=251359633">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>